package com.hbnu.common.service.impl;

import com.hbnu.common.dao.CheckInItemDao;
import com.hbnu.common.dao.UserDao;
import com.hbnu.common.entity.CheckInItem;
import com.hbnu.common.entity.User;
import com.hbnu.common.response.ServiceResponse;
import com.hbnu.common.service.MainService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.SQLException;
import java.util.List;

/**
 * {@inheritDoc}
 * <p>
 * 该实现类依赖 {@link UserDao} 和 {@link CheckInItemDao} 执行数据访问操作，
 * 并通过构造函数注入当前登录用户 {@link User} 信息，确保业务操作与用户身份绑定。
 * 所有方法均包含完整的业务校验（如权限校验、重复操作校验）和异常处理，保证业务稳定性。
 */

public class MainServiceImpl implements MainService {
    private static final Logger logger = LoggerFactory.getLogger(MainServiceImpl.class);

    private final User loginUser;
    private final UserDao userDao;
    private final CheckInItemDao checkInItemDao;

    /**
     * 构造函数，注入依赖组件和登录用户信息
     *
     * @param loginUser         当前登录用户实体（含用户名、密码等信息）
     * @param userDao           用户数据访问对象，用于执行用户相关数据库操作
     * @param checkInItemDao    打卡项数据访问对象，用于执行打卡项相关数据库操作
     */
    public MainServiceImpl(User loginUser, UserDao userDao, CheckInItemDao checkInItemDao) {
        this.loginUser = loginUser;
        this.userDao = userDao;
        this.checkInItemDao = checkInItemDao;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public ServiceResponse<Void> handleUpdatePassword(String newPassword) {
        try {
            userDao.updatePassword(loginUser.getUsername(), newPassword);
            loginUser.setPassword(newPassword);

            logger.info("修改密码成功：用户名={}", loginUser.getUsername());
            return ServiceResponse.success("修改成功");
        } catch (SQLException e) {
            logger.error("修改密码异常：用户名={}，异常信息={}",
                    loginUser.getUsername(), e.getMessage(), e);
            return ServiceResponse.fail("系统繁忙");
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public ServiceResponse<Void> handleAddCheckInItem(String itemName) {
        try {
            checkInItemDao.addItem(itemName, loginUser.getUsername());

            logger.info("创建打卡项成功：用户名={}, 打卡项名称={}",
                    loginUser.getUsername(), itemName);
            return ServiceResponse.success("创建成功");
        } catch (SQLException e) {
            logger.error("创建打卡项异常：用户名={}，打卡项名称={}，异常信息={}",
                    loginUser.getUsername(), itemName, e.getMessage(), e);
            return ServiceResponse.fail("系统繁忙");
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public ServiceResponse<List<CheckInItem>> handleGetAllCheckInItems() {
        try {
            List<CheckInItem> items = checkInItemDao.getItemsOfUser(loginUser.getUsername());

            logger.info("获取打卡项列表成功：用户名={}，打卡项数量={}",
                    loginUser.getUsername(), items.size());
            return ServiceResponse.success(items);
        } catch (SQLException e) {
            logger.error("获取打卡项异常：用户名={}，异常信息={}",
                    loginUser.getUsername(), e.getMessage(), e);
            return ServiceResponse.fail("系统繁忙");
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public ServiceResponse<Void> handleCheckIn(int itemId) {
        try {
            CheckInItem item = checkInItemDao.getItemById(itemId);
            if (item == null) {
                logger.warn("打卡失败：用户名={}，打卡项ID={}（打卡项不存在）",
                        loginUser.getUsername(), itemId);
                return ServiceResponse.fail("打卡项不存在");
            }

            if (!item.getUsername().equals(loginUser.getUsername())) {
                logger.warn("打卡失败：用户名={}，打卡项ID={}（无权操作他人打卡项）",
                        loginUser.getUsername(), itemId);
                return ServiceResponse.fail("无权操作他人的打卡项");
            }

            if (item.isCheckedInToday()) {
                logger.warn("打卡失败：用户名={}，打卡项ID={}（今日已打卡）",
                        loginUser.getUsername(), itemId);
                return ServiceResponse.fail("今天已经打过卡了");
            }

            checkInItemDao.checkInToday(itemId);
            logger.info("打卡成功：用户名={}, 打卡项ID={}",
                    loginUser.getUsername(), itemId);
            return ServiceResponse.success("打卡成功");
        } catch (SQLException e) {
            logger.error("打卡异常：用户名={}，打卡项ID={}，异常信息={}",
                    loginUser.getUsername(), itemId, e.getMessage(), e);
            return ServiceResponse.fail("系统繁忙");
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public ServiceResponse<Void> handleUpdateCheckInItem(int itemId, String newName) {
        try {
            CheckInItem item = checkInItemDao.getItemById(itemId);
            if (item == null) {
                logger.warn("修改打卡项失败：用户名={}，打卡项ID={}（打卡项不存在）",
                        loginUser.getUsername(), itemId);
                return ServiceResponse.fail("打卡项不存在");
            }

            if (!item.getUsername().equals(loginUser.getUsername())) {
                logger.warn("修改打卡项失败：用户名={}，打卡项ID={}（无权操作他人打卡项）",
                        loginUser.getUsername(), itemId);
                return ServiceResponse.fail("无权操作他人的打卡项");
            }

            checkInItemDao.updateItem(itemId, newName);
            logger.info("修改打卡项成功：用户名={}, 打卡项ID={}, 新名称={}",
                    loginUser.getUsername(), itemId, newName);
            return ServiceResponse.success("修改成功");
        } catch (SQLException e) {
            logger.error("修改打卡项异常：用户名={}，打卡项ID={}，新名称={}，异常信息={}",
                    loginUser.getUsername(), itemId, newName, e.getMessage(), e);
            return ServiceResponse.fail("系统繁忙");
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public ServiceResponse<Void> handleDeleteCheckInItem(int itemId) {
        try {
            CheckInItem item = checkInItemDao.getItemById(itemId);
            if (item == null) {
                logger.warn("删除打卡项失败：用户名={}，打卡项ID={}（打卡项不存在）",
                        loginUser.getUsername(), itemId);
                return ServiceResponse.fail("打卡项不存在");
            }

            if (!item.getUsername().equals(loginUser.getUsername())) {
                logger.warn("删除打卡项失败：用户名={}，打卡项ID={}（无权操作他人打卡项）",
                        loginUser.getUsername(), itemId);
                return ServiceResponse.fail("无权操作他人的打卡项");
            }

            checkInItemDao.deleteItem(itemId);
            logger.info("删除打卡项成功：用户名={}, 打卡项ID={}", loginUser.getUsername(), itemId);
            return ServiceResponse.success("删除成功");
        } catch (SQLException e) {
            logger.error("删除打卡项异常：用户名={}，打卡项ID={}，异常信息={}",
                    loginUser.getUsername(), itemId, e.getMessage(), e);
            return ServiceResponse.fail("系统繁忙");
        }
    }

    /**
     * {@inheritDoc}
     */
    public ServiceResponse<Void> handleUpdateNickname(String nickname) {
        try {
            userDao.updateNickname(loginUser.getUsername(), nickname);
            loginUser.setNickname(nickname);

            logger.info("修改昵称成功：用户名={}, 新昵称={}", loginUser.getUsername(), nickname);
            return ServiceResponse.success("修改成功");
        } catch (SQLException e) {
            logger.error("修改昵称异常：用户名={}，新昵称={}，异常信息={}",
                    loginUser.getUsername(), nickname, e.getMessage(), e);
            return ServiceResponse.fail("系统繁忙");
        }
    }
}
